﻿using System;
using System.Collections.Generic;

using Db4objects.Db4o;


namespace DataAccess
{

    /// <summary>
    /// Native query class.
    /// </summary>
    class NativeQueryAction<GenericType> : IQueryAction<GenericType>
                                where GenericType : class
    {

        private Predicate<GenericType> matchPredicate;
        
        /// <summary>
        /// The depth of the query in the objects' graph.
        /// </summary>
        private int queryDepth;


        /// <summary>
        /// NativeQueryAction constructor.
        /// </summary>
        /// <param name="matchPredicate"></param>
        /// <param name="queryDepth">The depth of the query in the objects' graph</param>
        public NativeQueryAction(Predicate<GenericType> matchPredicate, int queryDepth)
        {
            this.matchPredicate = matchPredicate;
            this.queryDepth = queryDepth;
        }


        /// <summary>
        /// Performs a query for data against the database.
        /// </summary>
        /// <param name="db">The database handle</param>
        /// <returns>The collection of objects retrieved by the query</returns>
        public IList<GenericType> PerformQuery(IObjectContainer db)
        {
            IList<GenericType> resultObjects = new List<GenericType>();

            IList<GenericType> queryResults = db.Query<GenericType>(matchPredicate);

            foreach (GenericType currentObject in queryResults)
            {
                db.Activate(currentObject, queryDepth);
                resultObjects.Add(currentObject);
            }

            return resultObjects;
        }

    }

}

